#ifndef SERVEUR_H
#define SERVEUR_H

#include <string>
#include <iostream>
#include <map>
#include <list>

#include "netUtil.h"
#include "proto.h"
#include "SessionClientSurServeur.h"

using namespace std;

class SessionClientSurServeur;

class Serveur
{
private:
    int port;
    int socketReception;
    int taille;
    pthread_t threadClient;

    map<string, SessionClientSurServeur*> listeClientsConnectes;
    pthread_mutex_t verrouListeClientsConnectes;

    list<string> listeSalles;
    pthread_mutex_t verrouListeSalles;

    map<string, list<string> > listeActivite;
    pthread_mutex_t verrouListeActivites;

    map<string , list<string> > listeObsDansSalle;
    pthread_mutex_t verrouListeObsDansSalle;

    map<string , list<string> > listeEtuDansSalle;
    pthread_mutex_t verrouListeEtuDansSalle;

    map<SessionClientSurServeur*, SessionClientSurServeur*> asssistance;

public:
    Serveur(int port = 8888);
    ~Serveur();
    void lancerServeur();
    bool ajouterLogin(string login, SessionClientSurServeur* session);
    void enleverLogin(string login);
    bool dispoSalle(string idSalle);
    SessionClientSurServeur* getSessionClient(string login);
    list<string> getListeSalles();
    list<string> getListeActivites(string idSalle);
    list<string> getListeObsDansSalle(string idSalle);
    list<string> getListeEtuDansSalle(string idSalle);
    bool ajouterSalle(string IdSalle);
    bool ajouterActivites(string IdSalle, list<string>listeAct);
    void ajouterObsDansSalle(string idSalle, string idObs);
    void ajouterEtuDansSalle(string idSalle, string idEtu);
    void enleverObsDansSalle(string idSalle, string idObs);
    void enleverEtuDansSalle(string idSalle, string idEtu);

    pthread_mutex_t *getVerrouListeClientsConnectes();
    pthread_mutex_t *getVerrouListeSalles();
    pthread_mutex_t *getVerrouListeActivite();
    pthread_mutex_t *getVerrouListeObsDansSalle();
    pthread_mutex_t *getVerrouListeEtuDansSalle();


    list<QuestionQCM> qcm;
};


#endif // SERVEUR_H
